package com.link2room.quintesson.facade.impl;

import com.link2room.common.constant.DefaultValue;
import com.link2room.common.entity.BaseEntity;
import com.link2room.common.enums.BaseSysExceptionEnum;
import com.link2room.common.jpa.condition.ConditionDetail;
import com.link2room.common.jpa.condition.L2RCondition;
import com.link2room.common.jpa.criteria.CriteriaUtil;
import com.link2room.common.jpa.result.QueryResult;
import com.link2room.common.service.ICommonService;
import com.link2room.common.util.BatchUtil;
import com.link2room.common.util.ClassConverUtil;
import com.link2room.common.util.StringUtil;
import com.link2room.enums.exception.QuintessonSysExceptionEnum;
import com.link2room.optimus.dto.param.base.TaobaoXrateplanBaseParamDto;
import com.link2room.optimus.dto.result.base.TaobaoXrateplanDto;
import com.link2room.quintesson.constant.QuintessonMnsConstant;
import com.link2room.quintesson.constant.QuintessonTaskNameConstant;
import com.link2room.quintesson.dto.param.base.TaobaoXrateplanHotelBaseParamDto;
import com.link2room.quintesson.dto.param.manager.TaobaoHotelRateplanManagerParamDto;
import com.link2room.quintesson.dto.result.base.TaobaoXrateplanHotelDto;
import com.link2room.quintesson.entity.TaobaoXrateplanHotel;
import com.link2room.quintesson.exception.TaobaoException;
import com.link2room.quintesson.facade.ITaobaoHotelRateplanFacadeService;
import com.link2room.quintesson.feign.optimus.TaobaoXrateplanFeignService;
import com.link2room.quintesson.service.ITaobaoAPIService;
import com.link2room.quintesson.util.TaobaoUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by sss on 2016/9/1.
 */
@Component("taobaoHotelRateplanFacadeService")
public class TaobaoHotelRateplanFacadeServiceImpl implements ITaobaoHotelRateplanFacadeService {
    @Resource
    private ICommonService commonService;
    @Resource
    private ITaobaoAPIService taobaoAPIService;
    @Autowired
    private TaobaoXrateplanFeignService taobaoXrateplanFeignService;


    /**
     * 更新酒店价格计划列表
     * @param taobaoXroomtypeManagerParamDto
     * @throws Exception
     */
    @Override
    public QueryResult<TaobaoXrateplanHotelDto> updateTaobaoHotelRateplanList(TaobaoHotelRateplanManagerParamDto taobaoXroomtypeManagerParamDto) throws Exception {
        if(taobaoXroomtypeManagerParamDto.getIds()!=null&& taobaoXroomtypeManagerParamDto.getIds().size()>0){
            L2RCondition l2RCondition=new L2RCondition();
            l2RCondition.setAndConditions(new ConditionDetail[]{
                    new ConditionDetail(BaseEntity.BaseEntity_.lhotelGroupCode.toString(), CriteriaUtil.Operator.EQ,taobaoXroomtypeManagerParamDto.getLhotelGroupCode()),
                    new ConditionDetail(BaseEntity.BaseEntity_.id.toString(), CriteriaUtil.Operator.IN,taobaoXroomtypeManagerParamDto.getIds()),
            });
            QueryResult<TaobaoXrateplanHotel> taobaoXrateplanHotelQueryResult = commonService.findAllByCondition(TaobaoXrateplanHotel.class, l2RCondition);
            if(taobaoXrateplanHotelQueryResult.getResultlist()!=null&&taobaoXrateplanHotelQueryResult.getResultlist().size()>0){
                if(StringUtil.isNotBlank(taobaoXroomtypeManagerParamDto.getIsHalt())){
                    for(TaobaoXrateplanHotel rateplanHotel:taobaoXrateplanHotelQueryResult.getResultlist()){
                        rateplanHotel.setIsHalt(taobaoXroomtypeManagerParamDto.getIsHalt());
                    }
                }
                commonService.updateList(taobaoXrateplanHotelQueryResult.getResultlist());
            }
            return ClassConverUtil.copyQueryResultToDtoQueryResult(taobaoXrateplanHotelQueryResult,TaobaoXrateplanHotelDto.class,false);
        }else{
            throw new TaobaoException(BaseSysExceptionEnum.PARAM_IS_NULL,taobaoXroomtypeManagerParamDto.toString());
        }
    }

    /**
     * 更新酒店价格计划
     * @param taobaoXroomtypeManagerParamDto
     * @throws Exception
     */
    @Override
    public TaobaoXrateplanHotelDto updateTaobaoHotelRateplan(TaobaoHotelRateplanManagerParamDto taobaoXroomtypeManagerParamDto) throws Exception {
        if(taobaoXroomtypeManagerParamDto.getId()!=null){
            TaobaoXrateplanHotel taobaoXrateplanHotel = commonService.findOneById(TaobaoXrateplanHotel.class, taobaoXroomtypeManagerParamDto.getId());
            if(StringUtil.isNotBlank(taobaoXroomtypeManagerParamDto.getIsHalt())){
                taobaoXrateplanHotel.setIsHalt(taobaoXroomtypeManagerParamDto.getIsHalt());
                commonService.updateById(taobaoXrateplanHotel);
            }
            return ClassConverUtil.copyPropertiesToDto(taobaoXrateplanHotel,TaobaoXrateplanHotelDto.class,false);
        }else{
            throw new TaobaoException(BaseSysExceptionEnum.PARAM_IS_NULL,taobaoXroomtypeManagerParamDto.toString());
        }
    }

    /**
     * 保存或更新飞猪酒店价格计划
     * @param taobaoXrateplanHotelBaseParamDto
     * @throws Exception
     */
    @Override
    public TaobaoXrateplanHotelDto saveOrUpdateTaobaoXrateplanHotel(TaobaoXrateplanHotelBaseParamDto taobaoXrateplanHotelBaseParamDto)throws Exception{
        String lhotelGroupCode=taobaoXrateplanHotelBaseParamDto.getLhotelGroupCode();
        String lhotelCode=taobaoXrateplanHotelBaseParamDto.getLhotelCode();
        String hotelRpCode=taobaoXrateplanHotelBaseParamDto.getHotelRpCode();
        String rpCode=taobaoXrateplanHotelBaseParamDto.getRpCode();
        String isHalt=taobaoXrateplanHotelBaseParamDto.getIsHalt();
        Long id=taobaoXrateplanHotelBaseParamDto.getId();
        TaobaoXrateplanHotel taobaoXrateplanHotel;
        if(id!=null){
            taobaoXrateplanHotel=commonService.findOneById(TaobaoXrateplanHotel.class,id);
        }else {
            TaobaoXrateplanHotel queryTRH=new TaobaoXrateplanHotel();
            queryTRH.setLhotelGroupCode(lhotelGroupCode);
            queryTRH.setLhotelCode(lhotelCode);
            queryTRH.setHotelRpCode(hotelRpCode);
            taobaoXrateplanHotel=commonService.findOneEQ(TaobaoXrateplanHotel.class,queryTRH);
        }
        if(taobaoXrateplanHotel!=null){
            taobaoXrateplanHotel.setIsHalt(isHalt);
            TaobaoXrateplanHotelDto taobaoXrateplanHotelDto=ClassConverUtil.copyPropertiesToDto(taobaoXrateplanHotel, TaobaoXrateplanHotelDto.class,false);
            TaobaoXrateplanBaseParamDto taobaoXrateplanBaseParamDto=new TaobaoXrateplanBaseParamDto();
            taobaoXrateplanBaseParamDto.setLhotelGroupCode(lhotelGroupCode);
            taobaoXrateplanBaseParamDto.setRpCode(rpCode);
            TaobaoXrateplanDto taobaoXrateplanDto=taobaoXrateplanFeignService.getTaobaoXrateplan(taobaoXrateplanBaseParamDto.paramToMap()).getResultInfo();
            if(taobaoXrateplanDto==null){
                throw new TaobaoException(QuintessonSysExceptionEnum.TAOBAO_RATEPLAN_NOT_EXIST,taobaoXrateplanBaseParamDto.toString());
            }
            if(5L==taobaoXrateplanHotel.getMatchStatus()){
                Long status=null;
                if(DefaultValue.T.equals(isHalt)){
                    status=2L;
                }else if(DefaultValue.F.equals(isHalt)){
                    status=1L;
                }
                taobaoXrateplanHotelDto.setStatus(status);
                taobaoAPIService.syncTaobaoXrateplan(taobaoXrateplanHotelDto, taobaoXrateplanDto);
            }
            ClassConverUtil.copyProperties(taobaoXrateplanHotelDto,taobaoXrateplanHotel);
            commonService.updateById(taobaoXrateplanHotel);
        }else {
            taobaoXrateplanHotel=new TaobaoXrateplanHotel();
            taobaoXrateplanHotel.setLhotelGroupCode(lhotelGroupCode);
            taobaoXrateplanHotel.setLhotelCode(lhotelCode);
            taobaoXrateplanHotel.setStatus(0L);
            taobaoXrateplanHotel.setRpCode(rpCode);
            taobaoXrateplanHotel.setHotelRpCode(hotelRpCode);
            commonService.save(taobaoXrateplanHotel);
        }
        return ClassConverUtil.copyPropertiesToDto(taobaoXrateplanHotel,TaobaoXrateplanHotelDto.class,false);
    }

    /**
     * 上传飞猪价格计划列表
     * @param taobaoHotelRateplanManagerParamDto
     * @throws Exception
     */
    @Override
    public void upTaobaoXrateplanList(TaobaoHotelRateplanManagerParamDto taobaoHotelRateplanManagerParamDto)throws Exception{
        if(taobaoHotelRateplanManagerParamDto.getIds()!=null&& taobaoHotelRateplanManagerParamDto.getIds().size()>0){
            TaobaoXrateplanBaseParamDto taobaoXrateplanBaseParamDto=new TaobaoXrateplanBaseParamDto();
            taobaoXrateplanBaseParamDto.setLhotelGroupCode(taobaoHotelRateplanManagerParamDto.getLhotelGroupCode());
            taobaoXrateplanBaseParamDto.setRpCode(taobaoHotelRateplanManagerParamDto.getRpCode());
            TaobaoXrateplanDto taobaoXrateplanDto=taobaoXrateplanFeignService.getTaobaoXrateplan(taobaoXrateplanBaseParamDto.paramToMap()).getResultInfo();
            if(taobaoXrateplanDto==null){
                throw new TaobaoException(QuintessonSysExceptionEnum.TAOBAO_RATEPLAN_NOT_EXIST,taobaoXrateplanBaseParamDto.toString());
            }
            List<TaobaoHotelRateplanManagerParamDto> hotelRateplanManagerParamDtos =new ArrayList<>();
            for(Long id: taobaoHotelRateplanManagerParamDto.getIds()){
                TaobaoHotelRateplanManagerParamDto tbHotelRateplanManagerParamDto=new TaobaoHotelRateplanManagerParamDto();
                tbHotelRateplanManagerParamDto.setId(id);
                tbHotelRateplanManagerParamDto.setTaobaoXrateplanDto(taobaoXrateplanDto);
                hotelRateplanManagerParamDtos.add(tbHotelRateplanManagerParamDto);
            }
            BatchUtil.beginBatchTask(QuintessonMnsConstant.QUEUE_UP_TAOBAO_XRATEPLAN, QuintessonTaskNameConstant.QUEUE_UP_TAOBAO_XRATEPLAN, hotelRateplanManagerParamDtos);
        }else{
            throw new TaobaoException(BaseSysExceptionEnum.PARAM_IS_NULL,taobaoHotelRateplanManagerParamDto.toString());
        }
    }

    /**
     * 上传飞猪价格计划
     * @param taobaoHotelRateplanManagerParamDto
     * @throws Exception
     */
    @Override
    public void upTaobaoXrateplan(TaobaoHotelRateplanManagerParamDto taobaoHotelRateplanManagerParamDto) throws Exception {
        TaobaoXrateplanHotel taobaoHotelRateplan=commonService.findOneById(TaobaoXrateplanHotel.class,taobaoHotelRateplanManagerParamDto.getId());
        if(taobaoHotelRateplan!=null){
            TaobaoUtil.setTaobaoClient(taobaoHotelRateplanManagerParamDto.getLhotelGroupCode());
            TaobaoXrateplanHotelDto taobaoXrateplanHotelDto = ClassConverUtil.copyPropertiesToDto(taobaoHotelRateplan, TaobaoXrateplanHotelDto.class, false);
            Long status=1L;
            if(DefaultValue.T.equals(taobaoXrateplanHotelDto.getIsHalt())){
                status=2L;
            }
            taobaoXrateplanHotelDto.setStatus(status);
            TaobaoXrateplanDto taobaoXrateplanDto=taobaoHotelRateplanManagerParamDto.getTaobaoXrateplanDto();
            if(StringUtil.isBlank(taobaoHotelRateplanManagerParamDto.getIsHalt())||DefaultValue.F.equals(taobaoHotelRateplanManagerParamDto.getIsBatch())){
                TaobaoXrateplanBaseParamDto taobaoXrateplanBaseParamDto=new TaobaoXrateplanBaseParamDto();
                taobaoXrateplanBaseParamDto.setLhotelGroupCode(taobaoHotelRateplanManagerParamDto.getLhotelGroupCode());
                taobaoXrateplanBaseParamDto.setRpCode(taobaoHotelRateplanManagerParamDto.getRpCode());
                taobaoXrateplanDto=taobaoXrateplanFeignService.getTaobaoXrateplan(taobaoXrateplanBaseParamDto.paramToMap()).getResultInfo();
            }
            if(taobaoXrateplanDto==null){
                throw new TaobaoException(QuintessonSysExceptionEnum.TAOBAO_RATEPLAN_NOT_EXIST,taobaoHotelRateplanManagerParamDto.toString());
            }
            taobaoAPIService.syncTaobaoXrateplan(taobaoXrateplanHotelDto, taobaoXrateplanDto);
            commonService.updateById(ClassConverUtil.copyProperties(taobaoXrateplanHotelDto,TaobaoXrateplanHotel.class));
        }
        BatchUtil.doBatchTaskDone(taobaoHotelRateplanManagerParamDto.getTaskMainId(),
                taobaoHotelRateplanManagerParamDto.getTaskId(),
                taobaoHotelRateplanManagerParamDto.getIsBatch());

    }


    /**
     * 飞猪价格计划酒店列表
     * @param taobaoXrateplanHotelBaseParamDto
     * @throws Exception
     */
    @Override
    public QueryResult<TaobaoXrateplanHotelDto> listTaobaoXrateplanHotels(TaobaoXrateplanHotelBaseParamDto taobaoXrateplanHotelBaseParamDto)throws Exception{
        TaobaoXrateplanHotel queryTXH=new TaobaoXrateplanHotel();
        queryTXH.setLhotelGroupCode(taobaoXrateplanHotelBaseParamDto.getLhotelGroupCode());
        queryTXH.setRpCode(taobaoXrateplanHotelBaseParamDto.getRpCode());
        QueryResult<TaobaoXrateplanHotel> taobaoXrateplanHotelQueryResult = commonService.findAllEQ(TaobaoXrateplanHotel.class,
                queryTXH, taobaoXrateplanHotelBaseParamDto.getCurrentPage(), taobaoXrateplanHotelBaseParamDto.getPageSize());
        return ClassConverUtil.copyQueryResultToDtoQueryResult(taobaoXrateplanHotelQueryResult, TaobaoXrateplanHotelDto.class, false);
    }

    /**
     * 飞猪单个价格计划
     * @param taobaoXrateplanHotelBaseParamDto
     * @throws Exception
     */
    @Override
    public TaobaoXrateplanHotelDto findTaobaoXrateplanHotelById(TaobaoXrateplanHotelBaseParamDto taobaoXrateplanHotelBaseParamDto)throws Exception{
        TaobaoXrateplanHotel taobaoXrateplanHotel = commonService.findOneById(TaobaoXrateplanHotel.class, taobaoXrateplanHotelBaseParamDto.getId());
        return ClassConverUtil.copyPropertiesToDto(taobaoXrateplanHotel,TaobaoXrateplanHotelDto.class, false);
    }

}
